// DateUtils.java
package com.zf.basetools;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

public class DateToolsUtils {

    /**
     * 获取系统当前时间，指定格式
     *
     * @param pattern 时间格式模式，如 "yyyy-MM-dd HH:mm:ss"
     * @return 格式化后的当前时间字符串
     */
    public static String getCurrentTime(String pattern) {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern, Locale.getDefault());
        return sdf.format(new Date());
    }
    /**
     * 获取当前日期字符串
     *
     * @return 返回格式化后的当前日期字符串，格式为 YYYY-MM-DD
     */
    public static String getCurrentDate() {
        return getCurrentTime("yyyy-MM-dd");
    }

    /**
     * 将时间戳转换为可读格式，指定格式
     *
     * @param timestamp 时间戳（毫秒）
     * @param pattern   时间格式模式
     * @return 格式化后的时间字符串
     */
    public static String formatTimestamp(long timestamp, String pattern) {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern, Locale.getDefault());
        return sdf.format(new Date(timestamp));
    }

    /**
     * 将时间戳字符串转换为可读格式
     *
     * @param timestamp 时间戳字符串
     * @param pattern   时间格式模式
     * @return 格式化后的时间字符串
     */
    public static String formatTimestamp(String timestamp, String pattern) {
        try {
            long time = Long.parseLong(timestamp);
            SimpleDateFormat sdf = new SimpleDateFormat(pattern, Locale.getDefault());
            return sdf.format(new Date(time));
        } catch (NumberFormatException e) {
            return "Invalid timestamp";
        }
    }

    /**
     * 获取指定天数偏移后的日期字符串
     *
     * @param days 天数偏移量，正数表示未来日期，负数表示过去日期
     * @param pattern   时间格式模式
     * @return 格式化后的日期字符串，格式为"yyyy-MM-dd"
     */
    public static String getOldDate(int days,String pattern) {
        SimpleDateFormat dft = new SimpleDateFormat(pattern, Locale.getDefault());
        Date beginDate = new Date();
        Calendar date = Calendar.getInstance();
        date.setTime(beginDate);
        date.set(Calendar.DATE, date.get(Calendar.DATE) + days);
        Date endDate = null;
        try {
            endDate = dft.parse(dft.format(date.getTime()));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return dft.format(endDate);
    }
    /**
     * 获取指定天数偏移后的日期时间字符串
     *
     * @param days 天数偏移量
     * @param pattern 时间格式模式
     * @param isEndOfDay true表示设置为当天结束时间(23:59:59)，false表示当天开始时间(00:00:00)
     * @return 格式化后的日期时间字符串
     */
    public static String getOldDate(int days, String pattern, boolean isEndOfDay) {
        SimpleDateFormat dft = new SimpleDateFormat(pattern, Locale.getDefault());
        Calendar date = Calendar.getInstance();
        date.add(Calendar.DATE, days);

        if (isEndOfDay) {
            // 设置为当天结束时间
            date.set(Calendar.HOUR_OF_DAY, 23);
            date.set(Calendar.MINUTE, 59);
            date.set(Calendar.SECOND, 59);
            date.set(Calendar.MILLISECOND, 999);
        } else {
            // 设置为当天开始时间
            date.set(Calendar.HOUR_OF_DAY, 0);
            date.set(Calendar.MINUTE, 0);
            date.set(Calendar.SECOND, 0);
            date.set(Calendar.MILLISECOND, 0);
        }

        return dft.format(date.getTime());
    }
    /**
     * 获取指定天数偏移后的日期字符串
     *
     * @param months 月数偏移量，正数表示未来日期，负数表示过去日期
     * @param pattern   时间格式模式
     * @return 格式化后的日期字符串，格式为"yyyy-MM-dd"
     */
    public static String getOldMonth(int months,String pattern) {
        SimpleDateFormat dft = new SimpleDateFormat(pattern, Locale.getDefault());
        Date beginDate = new Date();
        Calendar date = Calendar.getInstance();
        date.setTime(beginDate);
        date.set(Calendar.MONTH, date.get(Calendar.MONTH) + months);
        Date endDate = null;
        try {
            endDate = dft.parse(dft.format(date.getTime()));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return dft.format(endDate);
    }
}
